package com.open.core.handler;

import com.alibaba.fastjson2.JSONObject;
import com.open.core.entity.type.CommandType;
import com.open.core.entity.Command;
import com.open.core.common.Result;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.Map;

import static com.open.core.NettyServer.GROUPALL;
import static com.open.core.NettyServer.USERS;

//TextWebSocketFrame 表示一个文本帧
public class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
    //ChannelHandlerContext 表示用于处理事件和数据的上下文对象，通过它可以与通道进行交互、发送响应等操作。
    //TextWebSocketFrame 表示接收到的文本类型的 WebSocket 帧，可以从中获取客户端发送的文本消息内容。
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame frame) throws Exception {
        try {
            Command command = JSONObject.parseObject(frame.text(), Command.class);
            switch (CommandType.match(command.getCode())) {
                case CONNECTION: {
                    ConnectionHandler.excute(ctx, command);
                    break;
                }
                case CHAT: {
                    ChatHandler.excute(ctx, frame);
                    break;
                }
                case JOIN_GROUP: {
                    JoinGroupHandler.excute(ctx);
                    break;
                }
                default:
                    ctx.channel().writeAndFlush(Result.fail("Command 信息编码错误"));
            }
        } catch (Exception e) {
            ctx.channel().writeAndFlush(Result.fail(e.getMessage()));
        }
    }

    //用户下线时
    @Override
    public void channelInactive(ChannelHandlerContext ctx){
        String name = null;
        for (Map.Entry<String, Channel> entry : USERS.entrySet()) {
            if (entry.getValue().equals(ctx.channel())) {
                name = entry.getKey();  // 找到对应的 key，即用户 name
            }
        }
        System.out.println(name + "用户下线");
        USERS.remove(name);
        GROUPALL.remove(ctx.channel());
        GROUPALL.writeAndFlush(Result.success("alluser", USERS.keySet().toString()));
    }
}
